import Router from 'koa-router';
import Redis from 'koa-redis'
//通过node给邮箱发邮件 不只需要开启smtp服务还需要安装nodeMailer这个应用程序
import nodeMailer from 'nodemailer'
import User from '../dbs/models/users'
import Passport from './utils/passport'
import Email from '../dbs/config'
import axios from './utils/axios'

let router = new Router({
    // 前缀
    prefix: '/users'
})

// 获取到Redis客户端
let Store = new Redis().client

// 开始写接口

//注册接口

router.post('/signup',async (ctx) => {
    
    // 这定义的是传上来的数据
    const {
        username,
        password,
        email,
        code
    } = ctx.request.body;
    // 判断用户名
    let user = await User.find({
        username
    })
    if (user.length) {
        ctx.body = {
            code: -1,
            msg: '用户名已被注册'
        }
        return
    }
    else {
    if (code) {
        const saveCode = await Store.hget(`nodemail:${username}`, 'code')
        const saveExpire = await Store.hget(`nodemail:${username}`, 'expire')
        if (code === saveCode) {
            if (new Date().getTime() - saveExpire > 0) {
            ctx.body = {
                code: -1,
                msg: '验证码已过期，请重新尝试'
            }
            return false
            } else {
                // 这是一个写库的动作
            let nuser = await User.create({
                username,
                password,
                email
            })
            if (nuser) {
                let res = await axios.post('/users/signin', {username,password})
                if (res.data && res.data.code === 0) {
                    ctx.body = {
                        code: 0,
                        msg: '注册成功',
                        user: res.data.user
                    }
                } else {
                    ctx.body = {
                        code: -1,
                        msg: 'error'
                    }
                }
            } else {
                ctx.body = {
                    code: -1,
                    msg: '注册失败'
                }
            }
            }
        } else {
            ctx.body = {
            code: -1,
            msg: '请填写正确的验证码'
            }
        }
        // if (code !== saveCode) {
        //     ctx.body = {
        //         code: -1,
        //         msg: '请填写正确的验证码'
        //     }
        // }
        // else {
        //     if (new Date().getTime() - saveExpire > 0) {
        //         ctx.body = {
        //             code: -1,
        //             msg: '验证码已过期,请稍后再试'
        //         }
        //     }
        //     else {
        //         console.log('验证码正确了')
        //     }
        // }
        } else {
            ctx.body = {
                code: -1,
                msg: '请填写验证码'
            }
        }
    } 
    
})

// 登录接口

router.post('/signin',async (ctx,next) => {
    return Passport.authenticate('local',function(err,user,info,status) {
        if (err) {
            ctx.body = {
                code: -1,
                msg: err
            }
        } else {
            if (user) {
                ctx.body = {
                    code: 0,
                    msg: '登陆成功',
                    user
                }
                return ctx.login(user)
            }
            else {
                ctx.body = {
                    code: 1,
                    msg: info
                }
            }
        }
    })(ctx,next)
})

// 获取验证码的接口

router.post('/verify',async (ctx) => {
    // 用户输入的username
    let username = ctx.request.body.username
    // 取得过期时间
    const saveExpire = await Store.hget(`nodemail:${username}`,'expire')

    if (saveExpire && new Date().getTime()-saveExpire < 0) {
        ctx.body = {
            code: -1,
            msg: '请求过于频繁'
        }
        return false
    }
    // 通过node向邮箱发验证码
    let transporter = nodeMailer.createTransport({
        host: Email.smtp.host,
        port: 587,
        secure: false,
        auth: {
            user: Email.smtp.user,
            pass: Email.smtp.pass
        }
    })
    // 下面要明确对外发送信息的内容及接收方是谁
    
    // 接受的对象
    let ko = {
        code: Email.smtp.code(),
        expire: Email.smtp.expire(),
        email: ctx.request.body.email,
        user: ctx.request.body.username
    }

    // 邮件的内容

    let mailOptions = {
        from: Email.smtp.user,
        to: ko.email,
        subject: '美团网注册码',
        html: `您在美团网中注册,您的注册码为${ko.code}`
    }

    // 发送邮件

    await transporter.sendMail(mailOptions,(error, info) => {
        if (error) {
            return console.log(error)
        }
        else {
            // 向Redis里存数据
            Store.hmset(`nodemail:${ko.user}`,'code',ko.code,'expire',ko.expire,'email',ko.email)
        }
    })
    ctx.body = {
        code: 0,
        msg: '验证码已发送,有效期为一分钟'
    }
})

// 退出登录接口
router.get('/exit',async (ctx,next) => {
    await ctx.logout()
    // 判断是否还是登录状态
    if (ctx.isAuthenticated) {
        ctx.body = {
            code: 0
        }
    }
    else {
        ctx.body = {
            code: -1
        }
    }
})

// 获取用户名接口
router.get('/getUser',async (ctx) => {
    // 如果是登录状态
    if (ctx.isAuthenticated()) {
        const {username,email} = ctx.session.passport.user
        ctx.body = {
            user: username,
            email
        }
    }
    // 未登录状态
    else {
        ctx.body = {
            user: '',
            email: ''
        }
    }
})


export default router